/**
 * 格式化日期
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @param {string} format 格式化模板，如 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD') {
  if (!date) return ''
  
  const d = new Date(date)
  
  const year = d.getFullYear()
  const month = d.getMonth() + 1
  const day = d.getDate()
  const hour = d.getHours()
  const minute = d.getMinutes()
  const second = d.getSeconds()
  
  const padZero = (num) => num.toString().padStart(2, '0')
  
  return format
    .replace(/YYYY/g, year)
    .replace(/MM/g, padZero(month))
    .replace(/DD/g, padZero(day))
    .replace(/HH/g, padZero(hour))
    .replace(/mm/g, padZero(minute))
    .replace(/ss/g, padZero(second))
}

/**
 * 防抖函数
 * @param {Function} fn 需要防抖的函数
 * @param {number} delay 延迟时间，单位毫秒
 * @returns {Function} 防抖后的函数
 */
export function debounce(fn, delay = 300) {
  let timer = null
  return function(...args) {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, delay)
  }
}

/**
 * 节流函数
 * @param {Function} fn 需要节流的函数
 * @param {number} delay 延迟时间，单位毫秒
 * @returns {Function} 节流后的函数
 */
export function throttle(fn, delay = 300) {
  let lastTime = 0
  return function(...args) {
    const now = Date.now()
    if (now - lastTime >= delay) {
      fn.apply(this, args)
      lastTime = now
    }
  }
}

/**
 * 深拷贝对象
 * @param {Object} obj 需要拷贝的对象
 * @returns {Object} 拷贝后的对象
 */
export function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') return obj
  
  const clone = Array.isArray(obj) ? [] : {}
  
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      clone[key] = deepClone(obj[key])
    }
  }
  
  return clone
}

/**
 * 获取URL参数
 * @param {string} name 参数名
 * @param {string} url URL字符串，默认为当前页面URL
 * @returns {string|null} 参数值
 */
export function getUrlParam(name, url = window.location.href) {
  const reg = new RegExp('[?&]' + name + '=([^&#]*)', 'i')
  const match = url.match(reg)
  return match ? decodeURIComponent(match[1]) : null
}

/**
 * 生成随机字符串
 * @param {number} length 字符串长度
 * @returns {string} 随机字符串
 */
export function randomString(length = 8) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
  let result = ''
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length))
  }
  return result
}

/**
 * 存储数据到localStorage
 * @param {string} key 键名
 * @param {any} value 值
 */
export function setLocalStorage(key, value) {
  if (typeof value === 'object') {
    localStorage.setItem(key, JSON.stringify(value))
  } else {
    localStorage.setItem(key, value)
  }
}

/**
 * 从localStorage获取数据
 * @param {string} key 键名
 * @param {any} defaultValue 默认值
 * @returns {any} 存储的值
 */
export function getLocalStorage(key, defaultValue = null) {
  const value = localStorage.getItem(key)
  if (value === null) return defaultValue
  
  try {
    return JSON.parse(value)
  } catch (e) {
    return value
  }
}

/**
 * 移除localStorage中的数据
 * @param {string} key 键名
 */
export function removeLocalStorage(key) {
  localStorage.removeItem(key)
}

/**
 * 清空localStorage
 */
export function clearLocalStorage() {
  localStorage.clear()
}

/**
 * 验证邮箱格式
 * @param {string} email 邮箱地址
 * @returns {boolean} 是否合法
 */
export function validateEmail(email) {
  const reg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
  return reg.test(email)
}

/**
 * 验证手机号格式（中国大陆）
 * @param {string} phone 手机号
 * @returns {boolean} 是否合法
 */
export function validatePhone(phone) {
  const reg = /^1[3-9]\d{9}$/
  return reg.test(phone)
}

/**
 * 验证密码强度
 * @param {string} password 密码
 * @returns {number} 强度等级（1-3）
 */
export function checkPasswordStrength(password) {
  let strength = 0
  
  // 长度检查
  if (password.length >= 8) strength += 1
  
  // 包含数字和字母
  if (/[0-9]/.test(password) && /[a-zA-Z]/.test(password)) strength += 1
  
  // 包含特殊字符
  if (/[^a-zA-Z0-9]/.test(password)) strength += 1
  
  return strength
}

/**
 * 格式化金额
 * @param {number} amount 金额
 * @param {number} decimals 小数位数
 * @param {string} decimalSeparator 小数点符号
 * @param {string} thousandsSeparator 千分位符号
 * @returns {string} 格式化后的金额
 */
export function formatCurrency(amount, decimals = 2, decimalSeparator = '.', thousandsSeparator = ',') {
  const n = Math.abs(amount).toFixed(decimals)
  const [integer, decimal] = n.split('.')
  
  const integerFormatted = integer.replace(/\B(?=(\d{3})+(?!\d))/g, thousandsSeparator)
  
  return `${amount < 0 ? '-' : ''}${integerFormatted}${decimal ? decimalSeparator + decimal : ''}`
}